add in target data for the shape files
#write in the target data for the shapefile colours
target_2007 <- ae_wait_times %>%
group_by(year, hbt) %>%
summarise(ae_4hr_target_achieved =
round(mean(percent_4hr_target_achieved, na.rm = TRUE), digits = 2)) %>%
filter(year == 2007) %>%
rename(ae_target_2007 = ae_4hr_target_achieved) %>%
ungroup() %>%
select(hbt,ae_target_2007)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2008 <- ae_wait_times %>%
group_by(year, hbt) %>%
summarise(ae_4hr_target_achieved =
round(mean(percent_4hr_target_achieved, na.rm = TRUE), digits = 2)) %>%
filter(year == 2008) %>%
rename(ae_target_2008 = ae_4hr_target_achieved) %>%
ungroup() %>%
select(hbt,ae_target_2008)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2009 <- ae_wait_times %>%
group_by(year, hbt) %>%
summarise(ae_4hr_target_achieved =
round(mean(percent_4hr_target_achieved, na.rm = TRUE), digits = 2)) %>%
filter(year == 2009) %>%
rename(ae_target_2009 = ae_4hr_target_achieved) %>%
ungroup() %>%
select(hbt,ae_target_2009)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2010 <- ae_wait_times %>%
group_by(year, hbt) %>%
summarise(ae_4hr_target_achieved =
round(mean(percent_4hr_target_achieved, na.rm = TRUE), digits = 2)) %>%
filter(year == 2010) %>%
rename(ae_target_2010 = ae_4hr_target_achieved) %>%
ungroup() %>%
select(hbt,ae_target_2010)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2011 <- ae_wait_times %>%
group_by(year, hbt) %>%
summarise(ae_4hr_target_achieved =
round(mean(percent_4hr_target_achieved, na.rm = TRUE), digits = 2)) %>%
filter(year == 2011) %>%
rename(ae_target_2011 = ae_4hr_target_achieved) %>%
ungroup() %>%
select(hbt,ae_target_2011)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2012 <- ae_wait_times %>%
group_by(year, hbt) %>%
summarise(ae_4hr_target_achieved =
round(mean(percent_4hr_target_achieved, na.rm = TRUE), digits = 2)) %>%
filter(year == 2012) %>%
rename(ae_target_2012 = ae_4hr_target_achieved) %>%
ungroup() %>%
select(hbt,ae_target_2012)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2013 <- ae_wait_times %>%
group_by(year, hbt) %>%
summarise(ae_4hr_target_achieved =
round(mean(percent_4hr_target_achieved, na.rm = TRUE), digits = 2)) %>%
filter(year == 2013) %>%
rename(ae_target_2013 = ae_4hr_target_achieved) %>%
ungroup() %>%
select(hbt,ae_target_2013)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2014 <- ae_wait_times %>%
group_by(year, hbt) %>%
summarise(ae_4hr_target_achieved =
round(mean(percent_4hr_target_achieved, na.rm = TRUE), digits = 2)) %>%
filter(year == 2014) %>%
rename(ae_target_2014 = ae_4hr_target_achieved) %>%
ungroup() %>%
select(hbt,ae_target_2014)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2015 <- ae_wait_times %>%
group_by(year, hbt) %>%
summarise(ae_4hr_target_achieved =
round(mean(percent_4hr_target_achieved, na.rm = TRUE), digits = 2)) %>%
filter(year == 2015) %>%
rename(ae_target_2015 = ae_4hr_target_achieved) %>%
ungroup() %>%
select(hbt,ae_target_2015)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2016 <- ae_wait_times %>%
group_by(year, hbt) %>%
summarise(ae_4hr_target_achieved =
round(mean(percent_4hr_target_achieved, na.rm = TRUE), digits = 2)) %>%
filter(year == 2016) %>%
rename(ae_target_2016 = ae_4hr_target_achieved) %>%
ungroup() %>%
select(hbt,ae_target_2016)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2017 <- ae_wait_times %>%
group_by(year, hbt) %>%
summarise(ae_4hr_target_achieved =
round(mean(percent_4hr_target_achieved, na.rm = TRUE), digits = 2)) %>%
filter(year == 2017) %>%
rename(ae_target_2017 = ae_4hr_target_achieved) %>%
ungroup() %>%
select(hbt,ae_target_2017)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2018 <- ae_wait_times %>%
group_by(year, hbt) %>%
summarise(ae_4hr_target_achieved =
round(mean(percent_4hr_target_achieved, na.rm = TRUE), digits = 2)) %>%
filter(year == 2018) %>%
rename(ae_target_2018 = ae_4hr_target_achieved) %>%
ungroup() %>%
select(hbt,ae_target_2018)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2019 <- ae_wait_times %>%
group_by(year, hbt) %>%
summarise(ae_4hr_target_achieved =
round(mean(percent_4hr_target_achieved, na.rm = TRUE), digits = 2)) %>%
filter(year == 2019) %>%
rename(ae_target_2019 = ae_4hr_target_achieved) %>%
ungroup() %>%
select(hbt,ae_target_2019)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2020 <- ae_wait_times %>%
group_by(year, hbt) %>%
summarise(ae_4hr_target_achieved =
round(mean(percent_4hr_target_achieved, na.rm = TRUE), digits = 2)) %>%
filter(year == 2020) %>%
rename(ae_target_2020 = ae_4hr_target_achieved) %>%
ungroup() %>%
select(hbt,ae_target_2020)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2021 <- ae_wait_times %>%
group_by(year, hbt) %>%
summarise(ae_4hr_target_achieved =
round(mean(percent_4hr_target_achieved, na.rm = TRUE), digits = 2)) %>%
filter(year == 2021) %>%
rename(ae_target_2021 = ae_4hr_target_achieved) %>%
ungroup() %>%
select(hbt,ae_target_2021)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
shape file wrangling
centres <- scotland_smaller %>%
mutate(centres = round(st_centroid(st_make_valid(geometry))), digits = 4) %>%
mutate(lat = round(st_coordinates(centres)[,1], digits = 4),
long = round(st_coordinates(centres)[,2], digits = 4))
Error in `stopifnot()`:
! Problem while computing `centres = round(st_centroid(st_make_valid(geometry)))`.
Caused by error in `round()`:
! non-numeric argument to mathematical function
Backtrace:
1. ... %>% ...
8. dplyr:::mutate.data.frame(., centres = round(st_centroid(st_make_valid(geometry))), digits = 4)
9. dplyr:::mutate_cols(.data, dplyr_quosures(...), caller_env = caller_env())
11. mask$eval_all_mutate(quo)
SIMD graph
simd <- read_csv("raw_data/non_covid_raw_data/inpatient_and_daycase_by_nhs_board_of_treatment_and_simd.csv") %>% janitor::clean_names()
Rows: 40821 Columns: 18── Column specification ────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (11): Quarter, QuarterQF, HB, HBQF, Location, LocationQF, AdmissionType, AdmissionTypeQF...
dbl (7): SIMD, Episodes, LengthOfEpisode, AverageLengthOfEpisode, Stays, LengthOfStay, Aver...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
simd <- simd %>%
mutate(quarter_date = yq(quarter),
year = year(quarter_date),
.after = quarter)
simd %>%
write_csv("clean_data/non_covid_data/simd.csv")
# average episodes by SIMD value
# currently unfiltered for health board or admission type etc
simd_plotly <- simd %>%
drop_na(simd) %>%
mutate(simd = as.factor(simd)) %>% # gives each simd a separate colour
group_by(quarter, simd) %>%
summarise(avg_episodes = mean(episodes, na.rm = TRUE)) %>%
ggplot(aes(x = quarter, y = avg_episodes, group = simd))+
geom_line(aes(colour = simd))+
geom_point(aes(text = paste0("Date: ", quarter, "<br>",
"Average Episodes: ", round(avg_episodes, digits = 2), "<br>",
"SIMD: ", simd),
colour = simd),size = 0.5)+
scale_y_continuous(labels = scales::comma)+
labs(title = "Average Hospital Episodes by SIMD Deprevation score\n",
x = "\nYear and Quarter",
y = "Average Episodes\n")+
theme_minimal()+
theme(axis.text.x = element_text(angle = 45, hjust = 1))
`summarise()` has grouped output by 'quarter'. You can override using the `.groups` argument.Warning: Ignoring unknown aesthetics: text
ggplotly(simd_plotly, tooltip = "text") %>%
config(displayModeBar = FALSE)
NA
NA
Age Graph
age_sex <- read_csv("raw_data/non_covid_raw_data/inpatient_and_daycase_by_nhs_board_of_treatment_age_and_sex.csv") %>% janitor::clean_names()
Rows: 129393 Columns: 18── Column specification ────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (12): Quarter, QuarterQF, HB, HBQF, Location, LocationQF, AdmissionType, AdmissionTypeQF...
dbl (6): Episodes, LengthOfEpisode, AverageLengthOfEpisode, Stays, LengthOfStay, AverageLen...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
age_sex <- age_sex %>%
mutate(quarter_date = yq(quarter),
year = year(quarter_date),
.after = quarter)
age_sex %>%
write_csv("clean_data/non_covid_data/age_sex.csv")
# Average number of episode for age groups
# currently unfiltered by department or anything else
age_plotly <- age_sex %>%
#filter(min_date < year & year < max_date) %>%
group_by(quarter, age) %>%
summarise(avg_episodes = mean(episodes, na.rm = TRUE)) %>%
ggplot(aes(x = quarter, y = avg_episodes))+
geom_line(aes(colour = age, group = age))+
geom_point(aes(colour = age,
text = paste0("Date: ", quarter, "<br>",
"Average Episodes: ", round(avg_episodes, digits = 2), "<br>",
"Age Group: ", age)),size = 0.5)+
labs(title = "Average Hospital Episodes by Age Groups\n",
x = "\nYear and Quarter",
y = "Average Episodes\n")+
theme_minimal()+
theme(axis.text.x = element_text(angle = 45, hjust = 1))
`summarise()` has grouped output by 'quarter'. You can override using the `.groups` argument.Warning: Ignoring unknown aesthetics: text
ggplotly(age_plotly, tooltip = "text") %>%
config(displayModeBar = FALSE)
Gender
sex_plotly <- age_sex %>%
group_by(quarter, sex) %>%
summarise(avg_length_of_episode = mean(average_length_of_episode, na.rm = TRUE)) %>%
ggplot(aes(x = quarter, y = avg_length_of_episode))+
geom_line(aes(colour = sex, group = sex))+
geom_point(aes(colour = sex,
text = paste0("Date: ", quarter, "<br>",
"Gender: ", sex)),
size = 0.5)+
labs(title = "Average Hospital Episodes by Gender\n",
x = "\nYear and Quarter",
y = "Average Episodes\n")+
theme_minimal()+
theme(axis.text.x = element_text(angle = 45, hjust = 1))
`summarise()` has grouped output by 'quarter'. You can override using the `.groups` argument.Warning: Ignoring unknown aesthetics: text
ggplotly(sex_plotly, tooltip = "text") %>%
config(displayModeBar = FALSE)
A&E Tab
#THE A&E WAI TTIMES IS HANDLED ABOVE IN THE SHAPEFILE WRANGLING SECTION
#read the geo package in
scotland = st_read("clean_data/shapefile/scotland_smaller.gpkg")
Reading layer `scotland_smaller' from data source
`C:\Users\neilp\Documents\CODECLAN\phs_scotland_group_project\phs_scotland_group_project\clean_data\shapefile\scotland_smaller.gpkg'
using driver `GPKG'
Simple feature collection with 14 features and 19 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 5512.998 ymin: 530635.8 xmax: 470290.5 ymax: 1220302
Projected CRS: OSGB 1936 / British National Grid
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHpvbykNCmBgYA0KDQoNCg0KIyMgQ292aWQgVGFiDQpgYGB7cn0NCiNsb2FkIGluIGJlZHMgYW5kIGFkZCB5ZWFyIGNvbHVtbg0KYmVkcyA8LSByZWFkX2NzdigicmF3X2RhdGEvbm9uX2NvdmlkX3Jhd19kYXRhL2JlZHNfYnlfbmhzX2JvYXJkX29mX3RyZWF0bWVudF9hbmRfc3BlY2lhbHR5LmNzdiIpICU+JSBqYW5pdG9yOjpjbGVhbl9uYW1lcygpDQoNCmJlZHMgPC0gYmVkcyAlPiUgDQptdXRhdGUocXVhcnRlcl9kYXRlID0geXEocXVhcnRlciksDQogICAgICAgeWVhciA9IHllYXIocXVhcnRlcl9kYXRlKSwgDQogICAgICAgLmFmdGVyID0gcXVhcnRlcikNCg0KYmVkcyAlPiUgDQp3cml0ZV9jc3YoImNsZWFuX2RhdGEvbm9uX2NvdmlkX2RhdGEvYmVkcy5jc3YiKQ0KYGBgDQoNCiMgUGxvdCBmb3IgYmVkIGF2YWlsYWJpbGl0eSBmb3IgYWxsIGFjdXRlDQpgYGB7cn0NCiMgYmVkIHBlcmNlbnRhZ2UgYXZhaWxhYmxpdHkgZm9yICJhbGwgYWN1dGUiDQojIFdpbGwgbmVlZCB0byBhZGQgZmlsdGVyIGZvciB5ZWFyIGJhc2VkIG9uIHVzZXIgaW5wdXQNCmJlZHNfcGxvdGx5IDwtIGJlZHMgJT4lDQogIGZpbHRlcihzcGVjaWFsdHlfbmFtZSA9PSAiQWxsIEFjdXRlIikgJT4lIA0KICBncm91cF9ieShxdWFydGVyLCBzcGVjaWFsdHlfbmFtZSkgJT4lDQogIHN1bW1hcmlzZShtZWFuX3BlcmNfb2NjID0gbWVhbihwZXJjZW50YWdlX29jY3VwYW5jeSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcXVhcnRlciwgeSA9IG1lYW5fcGVyY19vY2MpKSsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvdXIgPSBzcGVjaWFsdHlfbmFtZSwgZ3JvdXAgPSBzcGVjaWFsdHlfbmFtZSkpKw0KICBnZW9tX3BvaW50KGFlcygNCiAgICB0ZXh0ID0gcGFzdGUwKCJPY2N1cGFuY3k6ICIscm91bmQobWVhbl9wZXJjX29jYywgZGlnaXRzID0gMiksIiU8YnI+IiwiRGF0ZTogIiwgcXVhcnRlcikpLA0KICAgIHNpemUgPSAwLjUpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSsNCiAgbGFicyh0aXRsZSA9ICJNZWFuIGJlZCBhdmFpbGFiaWxpdHkgZm9yIGFsbCBBY3V0ZSBQYXRpZW50cyIsDQogICAgICAgeCA9ICJcblllYXIgYW5kIFF1YXJ0ZXIiLA0KICAgICAgIHkgPSAiQXZlcmFnZSBQZXJjZW50YWdlIE9jY3VwYW5jeSIpDQoNCmdncGxvdGx5KGJlZHNfcGxvdGx5LCB0b29sdGlwID0gInRleHQiKSAlPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUgDQogIGxheW91dChob3ZlcmxhYmVsPWxpc3QoYmdjb2xvcj0icmVkIikpDQoNCg0KYGBgDQoNCiMjIFNjb3RsYW5kIFNoYXBlZmlsZQ0KIyMjIyBhZV93YWl0X3RpbWVzIHdyYW5nbGluZw0KYGBge3J9DQphZV93YWl0X3RpbWVzIDwtIHJlYWRfY3N2KCJyYXdfZGF0YS9ub25fY292aWRfcmF3X2RhdGEvbW9udGhseV9hZV93YWl0aW5ndGltZXNfMjAyMjA2LmNzdiIpICU+JSBqYW5pdG9yOjpjbGVhbl9uYW1lcygpDQoNCiNtYWtlIGEgZGF0ZSBhbmQgeWVhciBjb2x1bW4gd2l0aCB0aGUgZmlyc3QgZGF0ZSBvZiBldmVyeSBtb250aA0KYWVfd2FpdF90aW1lcyA8LSBhZV93YWl0X3RpbWVzICU+JSANCiAgbXV0YXRlKGRhdGUgPSB5bShtb250aCksIC5hZnRlciA9IG1vbnRoLA0KICAgICAgICAgeWVhciA9IHllYXIoZGF0ZSkpDQoNCiNtYWtlIGEgcGVyY2VudCBjb2x1bW4gd2l0aCBwZXJjZW50IG9mIHBhdGllbnRzIG1lZXRpbmcgdGhlIDRociB0YXJnZXQgdGltZQ0KYWVfd2FpdF90aW1lcyA8LSBhZV93YWl0X3RpbWVzICU+JSANCiAgbXV0YXRlKHBlcmNlbnRfNGhyX3RhcmdldF9hY2hpZXZlZCA9IChudW1iZXJfbWVldGluZ190YXJnZXRfYWdncmVnYXRlL251bWJlcl9vZl9hdHRlbmRhbmNlc19hZ2dyZWdhdGUpKjEwMCkNCg0KYWVfd2FpdF90aW1lcyAlPiUgDQp3cml0ZV9jc3YoImNsZWFuX2RhdGEvbm9uX2NvdmlkX2RhdGEvYWVfd2FpdF90aW1lcy5jc3YiKQ0KYGBgDQoNCiMgYWRkIGluIHRhcmdldCBkYXRhIGZvciB0aGUgc2hhcGUgZmlsZXMNCmBgYHtyfQ0KI3dyaXRlIGluIHRoZSB0YXJnZXQgZGF0YSBmb3IgdGhlIHNoYXBlZmlsZSBjb2xvdXJzDQp0YXJnZXRfMjAwNyA8LSBhZV93YWl0X3RpbWVzICU+JQ0KICBncm91cF9ieSh5ZWFyLCBoYnQpICU+JSANCiAgc3VtbWFyaXNlKGFlXzRocl90YXJnZXRfYWNoaWV2ZWQgPSANCiAgICAgICAgICAgICAgcm91bmQobWVhbihwZXJjZW50XzRocl90YXJnZXRfYWNoaWV2ZWQsIG5hLnJtID0gVFJVRSksIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMDcpICU+JSANCiAgcmVuYW1lKGFlX3RhcmdldF8yMDA3ID0gYWVfNGhyX3RhcmdldF9hY2hpZXZlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoaGJ0LGFlX3RhcmdldF8yMDA3KQ0KICANCg0KdGFyZ2V0XzIwMDggPC0gYWVfd2FpdF90aW1lcyAlPiUNCiAgZ3JvdXBfYnkoeWVhciwgaGJ0KSAlPiUgDQogIHN1bW1hcmlzZShhZV80aHJfdGFyZ2V0X2FjaGlldmVkID0gDQogICAgICAgICAgICAgIHJvdW5kKG1lYW4ocGVyY2VudF80aHJfdGFyZ2V0X2FjaGlldmVkLCBuYS5ybSA9IFRSVUUpLCBkaWdpdHMgPSAyKSkgJT4lDQogIGZpbHRlcih5ZWFyID09IDIwMDgpICU+JSANCiAgcmVuYW1lKGFlX3RhcmdldF8yMDA4ID0gYWVfNGhyX3RhcmdldF9hY2hpZXZlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoaGJ0LGFlX3RhcmdldF8yMDA4KQ0KDQp0YXJnZXRfMjAwOSA8LSBhZV93YWl0X3RpbWVzICU+JQ0KICBncm91cF9ieSh5ZWFyLCBoYnQpICU+JSANCiAgc3VtbWFyaXNlKGFlXzRocl90YXJnZXRfYWNoaWV2ZWQgPSANCiAgICAgICAgICAgICAgcm91bmQobWVhbihwZXJjZW50XzRocl90YXJnZXRfYWNoaWV2ZWQsIG5hLnJtID0gVFJVRSksIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMDkpICU+JSANCiAgcmVuYW1lKGFlX3RhcmdldF8yMDA5ID0gYWVfNGhyX3RhcmdldF9hY2hpZXZlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY2F0KGhidCxhZV90YXJnZXRfMjAwOSkNCg0KdGFyZ2V0XzIwMTAgPC0gYWVfd2FpdF90aW1lcyAlPiUNCiAgZ3JvdXBfYnkoeWVhciwgaGJ0KSAlPiUgDQogIHN1bW1hcmlzZShhZV80aHJfdGFyZ2V0X2FjaGlldmVkID0gDQogICAgICAgICAgICAgIHJvdW5kKG1lYW4ocGVyY2VudF80aHJfdGFyZ2V0X2FjaGlldmVkLCBuYS5ybSA9IFRSVUUpLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDEwKSAlPiUgDQogIHJlbmFtZShhZV90YXJnZXRfMjAxMCA9IGFlXzRocl90YXJnZXRfYWNoaWV2ZWQpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KGhidCxhZV90YXJnZXRfMjAxMCkNCg0KdGFyZ2V0XzIwMTEgPC0gYWVfd2FpdF90aW1lcyAlPiUNCiAgZ3JvdXBfYnkoeWVhciwgaGJ0KSAlPiUgDQogIHN1bW1hcmlzZShhZV80aHJfdGFyZ2V0X2FjaGlldmVkID0gDQogICAgICAgICAgICAgIHJvdW5kKG1lYW4ocGVyY2VudF80aHJfdGFyZ2V0X2FjaGlldmVkLCBuYS5ybSA9IFRSVUUpLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDExKSAlPiUgDQogIHJlbmFtZShhZV90YXJnZXRfMjAxMSA9IGFlXzRocl90YXJnZXRfYWNoaWV2ZWQpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KGhidCxhZV90YXJnZXRfMjAxMSkNCg0KdGFyZ2V0XzIwMTIgPC0gYWVfd2FpdF90aW1lcyAlPiUNCiAgZ3JvdXBfYnkoeWVhciwgaGJ0KSAlPiUgDQogIHN1bW1hcmlzZShhZV80aHJfdGFyZ2V0X2FjaGlldmVkID0gDQogICAgICAgICAgICAgIHJvdW5kKG1lYW4ocGVyY2VudF80aHJfdGFyZ2V0X2FjaGlldmVkLCBuYS5ybSA9IFRSVUUpLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDEyKSAlPiUgDQogIHJlbmFtZShhZV90YXJnZXRfMjAxMiA9IGFlXzRocl90YXJnZXRfYWNoaWV2ZWQpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KGhidCxhZV90YXJnZXRfMjAxMikNCg0KdGFyZ2V0XzIwMTMgPC0gYWVfd2FpdF90aW1lcyAlPiUNCiAgZ3JvdXBfYnkoeWVhciwgaGJ0KSAlPiUgDQogIHN1bW1hcmlzZShhZV80aHJfdGFyZ2V0X2FjaGlldmVkID0gDQogICAgICAgICAgICAgIHJvdW5kKG1lYW4ocGVyY2VudF80aHJfdGFyZ2V0X2FjaGlldmVkLCBuYS5ybSA9IFRSVUUpLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDEzKSAlPiUgDQogIHJlbmFtZShhZV90YXJnZXRfMjAxMyA9IGFlXzRocl90YXJnZXRfYWNoaWV2ZWQpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KGhidCxhZV90YXJnZXRfMjAxMykNCg0KdGFyZ2V0XzIwMTQgPC0gYWVfd2FpdF90aW1lcyAlPiUNCiAgZ3JvdXBfYnkoeWVhciwgaGJ0KSAlPiUgDQogIHN1bW1hcmlzZShhZV80aHJfdGFyZ2V0X2FjaGlldmVkID0NCiAgICAgICAgICAgICAgcm91bmQobWVhbihwZXJjZW50XzRocl90YXJnZXRfYWNoaWV2ZWQsIG5hLnJtID0gVFJVRSksIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMTQpICU+JSANCiAgcmVuYW1lKGFlX3RhcmdldF8yMDE0ID0gYWVfNGhyX3RhcmdldF9hY2hpZXZlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoaGJ0LGFlX3RhcmdldF8yMDE0KQ0KDQp0YXJnZXRfMjAxNSA8LSBhZV93YWl0X3RpbWVzICU+JQ0KICBncm91cF9ieSh5ZWFyLCBoYnQpICU+JSANCiAgc3VtbWFyaXNlKGFlXzRocl90YXJnZXRfYWNoaWV2ZWQgPSANCiAgICAgICAgICAgICAgcm91bmQobWVhbihwZXJjZW50XzRocl90YXJnZXRfYWNoaWV2ZWQsIG5hLnJtID0gVFJVRSksIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMTUpICU+JSANCiAgcmVuYW1lKGFlX3RhcmdldF8yMDE1ID0gYWVfNGhyX3RhcmdldF9hY2hpZXZlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoaGJ0LGFlX3RhcmdldF8yMDE1KQ0KDQp0YXJnZXRfMjAxNiA8LSBhZV93YWl0X3RpbWVzICU+JQ0KICBncm91cF9ieSh5ZWFyLCBoYnQpICU+JSANCiAgc3VtbWFyaXNlKGFlXzRocl90YXJnZXRfYWNoaWV2ZWQgPSANCiAgICAgICAgICAgICAgcm91bmQobWVhbihwZXJjZW50XzRocl90YXJnZXRfYWNoaWV2ZWQsIG5hLnJtID0gVFJVRSksIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMTYpICU+JSANCiAgcmVuYW1lKGFlX3RhcmdldF8yMDE2ID0gYWVfNGhyX3RhcmdldF9hY2hpZXZlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoaGJ0LGFlX3RhcmdldF8yMDE2KQ0KDQp0YXJnZXRfMjAxNyA8LSBhZV93YWl0X3RpbWVzICU+JQ0KICBncm91cF9ieSh5ZWFyLCBoYnQpICU+JSANCiAgc3VtbWFyaXNlKGFlXzRocl90YXJnZXRfYWNoaWV2ZWQgPSANCiAgICAgICAgICAgICAgcm91bmQobWVhbihwZXJjZW50XzRocl90YXJnZXRfYWNoaWV2ZWQsIG5hLnJtID0gVFJVRSksIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMTcpICU+JSANCiAgcmVuYW1lKGFlX3RhcmdldF8yMDE3ID0gYWVfNGhyX3RhcmdldF9hY2hpZXZlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoaGJ0LGFlX3RhcmdldF8yMDE3KQ0KDQp0YXJnZXRfMjAxOCA8LSBhZV93YWl0X3RpbWVzICU+JQ0KICBncm91cF9ieSh5ZWFyLCBoYnQpICU+JSANCiAgc3VtbWFyaXNlKGFlXzRocl90YXJnZXRfYWNoaWV2ZWQgPSANCiAgICAgICAgICAgICAgcm91bmQobWVhbihwZXJjZW50XzRocl90YXJnZXRfYWNoaWV2ZWQsIG5hLnJtID0gVFJVRSksIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JSANCiAgcmVuYW1lKGFlX3RhcmdldF8yMDE4ID0gYWVfNGhyX3RhcmdldF9hY2hpZXZlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoaGJ0LGFlX3RhcmdldF8yMDE4KQ0KDQp0YXJnZXRfMjAxOSA8LSBhZV93YWl0X3RpbWVzICU+JQ0KICBncm91cF9ieSh5ZWFyLCBoYnQpICU+JSANCiAgc3VtbWFyaXNlKGFlXzRocl90YXJnZXRfYWNoaWV2ZWQgPSANCiAgICAgICAgICAgICAgcm91bmQobWVhbihwZXJjZW50XzRocl90YXJnZXRfYWNoaWV2ZWQsIG5hLnJtID0gVFJVRSksIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMTkpICU+JSANCiAgcmVuYW1lKGFlX3RhcmdldF8yMDE5ID0gYWVfNGhyX3RhcmdldF9hY2hpZXZlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoaGJ0LGFlX3RhcmdldF8yMDE5KQ0KDQp0YXJnZXRfMjAyMCA8LSBhZV93YWl0X3RpbWVzICU+JQ0KICBncm91cF9ieSh5ZWFyLCBoYnQpICU+JSANCiAgc3VtbWFyaXNlKGFlXzRocl90YXJnZXRfYWNoaWV2ZWQgPSANCiAgICAgICAgICAgICAgcm91bmQobWVhbihwZXJjZW50XzRocl90YXJnZXRfYWNoaWV2ZWQsIG5hLnJtID0gVFJVRSksIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjApICU+JSANCiAgcmVuYW1lKGFlX3RhcmdldF8yMDIwID0gYWVfNGhyX3RhcmdldF9hY2hpZXZlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoaGJ0LGFlX3RhcmdldF8yMDIwKQ0KDQp0YXJnZXRfMjAyMSA8LSBhZV93YWl0X3RpbWVzICU+JQ0KICBncm91cF9ieSh5ZWFyLCBoYnQpICU+JSANCiAgc3VtbWFyaXNlKGFlXzRocl90YXJnZXRfYWNoaWV2ZWQgPSANCiAgICAgICAgICAgICAgcm91bmQobWVhbihwZXJjZW50XzRocl90YXJnZXRfYWNoaWV2ZWQsIG5hLnJtID0gVFJVRSksIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgcmVuYW1lKGFlX3RhcmdldF8yMDIxID0gYWVfNGhyX3RhcmdldF9hY2hpZXZlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoaGJ0LGFlX3RhcmdldF8yMDIxKQ0KICANCmBgYA0KDQojIyMjIHNoYXBlIGZpbGUgd3JhbmdsaW5nDQpgYGB7cn0NCnNjb3RsYW5kIDwtIHN0X3JlYWQoIi4uL1NHX05IU19IZWFsdGhCb2FyZHNfMjAxOV9zaGFwZWZpbGUvU0dfTkhTX0hlYWx0aEJvYXJkc18yMDE5LnNocCIpDQoNCiMgbWFrZSBhIHNtYWxsZXIgdmVyc2lvbiBmb3IgcGVyZm9ybWFuY2UgaXNzdWVzDQpzY290bGFuZF9zbWFsbGVyIDwtIHNjb3RsYW5kICU+JSANCiAgc3Rfc2ltcGxpZnkoVFJVRSwgZFRvbGVyYW5jZSA9IDIwMDApDQojZml4ZXMgcHJvYmxlbXMgY2F1c2VkIGJ5IGFib3ZlIA0Kc2NvdGxhbmRfc21hbGxlciA8LSBzZjo6c3RfY2FzdChzY290bGFuZF9zbWFsbGVyLCAiTVVMVElQT0xZR09OIikNCg0KIyBjZW50cmVzIDwtICBzY290bGFuZF9zbWFsbGVyICU+JSANCiMgICBtdXRhdGUoY2VudHJlcyA9IHN0X2NlbnRyb2lkKHN0X21ha2VfdmFsaWQoZ2VvbWV0cnkpKSkgJT4lDQojICAgICBtdXRhdGUobGF0ID0gc3RfY29vcmRpbmF0ZXMoY2VudHJlcylbLDFdLA0KIyAgICAgICAgICAgIGxvbmcgPSBzdF9jb29yZGluYXRlcyhjZW50cmVzKVssMl0pYQ0KDQojYWRkIGluIHRoZSBBJkUgNCBociB0YXJnZXQgZGF0YSBmb3IgZWFjaCB5ZWFyDQpzY290bGFuZF9zbWFsbGVyIDwtICBzY290bGFuZF9zbWFsbGVyICU+JSANCiAgICBtdXRhdGUodGFyZ2V0XzIwMDcgPSB0YXJnZXRfMjAwNyRhZV90YXJnZXRfMjAwNywNCiAgICAgICAgICAgdGFyZ2V0XzIwMDggPSB0YXJnZXRfMjAwOCRhZV90YXJnZXRfMjAwOCwNCiAgICAgICAgICAgdGFyZ2V0XzIwMDkgPSB0YXJnZXRfMjAwOSRhZV90YXJnZXRfMjAwOSwNCiAgICAgICAgICAgdGFyZ2V0XzIwMTAgPSB0YXJnZXRfMjAxMCRhZV90YXJnZXRfMjAxMCwNCiAgICAgICAgICAgdGFyZ2V0XzIwMTEgPSB0YXJnZXRfMjAxMSRhZV90YXJnZXRfMjAxMSwNCiAgICAgICAgICAgdGFyZ2V0XzIwMTIgPSB0YXJnZXRfMjAxMiRhZV90YXJnZXRfMjAxMiwNCiAgICAgICAgICAgdGFyZ2V0XzIwMTMgPSB0YXJnZXRfMjAxMyRhZV90YXJnZXRfMjAxMywNCiAgICAgICAgICAgdGFyZ2V0XzIwMTQgPSB0YXJnZXRfMjAxNCRhZV90YXJnZXRfMjAxNCwNCiAgICAgICAgICAgdGFyZ2V0XzIwMTUgPSB0YXJnZXRfMjAxNSRhZV90YXJnZXRfMjAxNSwNCiAgICAgICAgICAgdGFyZ2V0XzIwMTYgPSB0YXJnZXRfMjAxNiRhZV90YXJnZXRfMjAxNiwNCiAgICAgICAgICAgdGFyZ2V0XzIwMTcgPSB0YXJnZXRfMjAxNyRhZV90YXJnZXRfMjAxNywNCiAgICAgICAgICAgdGFyZ2V0XzIwMTggPSB0YXJnZXRfMjAxOCRhZV90YXJnZXRfMjAxOCwNCiAgICAgICAgICAgdGFyZ2V0XzIwMTkgPSB0YXJnZXRfMjAxOSRhZV90YXJnZXRfMjAxOSwNCiAgICAgICAgICAgdGFyZ2V0XzIwMjAgPSB0YXJnZXRfMjAyMCRhZV90YXJnZXRfMjAyMCwNCiAgICAgICAgICAgdGFyZ2V0XzIwMjEgPSB0YXJnZXRfMjAyMSRhZV90YXJnZXRfMjAyMQ0KICAgICAgICAgICAgICAgICAgKQ0KDQojIHNhdmUgdGhlIG1hcA0Kc3Rfd3JpdGUoc2NvdGxhbmRfc21hbGxlciwgImNsZWFuX2RhdGEvc2hhcGVmaWxlL3Njb3RsYW5kX3NtYWxsZXIuZ3BrZyIsIGFwcGVuZCA9IEZBTFNFKSANCg0KIyMgcmVsb2FkIHRoZSBtYXANCnNjb3RsYW5kX3NtYWxsZXIgPC0gc3RfcmVhZCgiY2xlYW5fZGF0YS9zaGFwZWZpbGUvc2NvdGxhbmRfc21hbGxlci5ncGtnIikgDQoNCiMgIyBUaGlzIHdpbGwgcmVxdWlyZSBmaWx0ZXJlZCBieSB0aGUgeWVhciBzZWxlY3RlZCBpbiB0aGUgZGFzaGJvYXJkDQojICMgQ2FuIHdlIGdldCB0aGUgYnV0dG9uIG9yIGRyb3Bkb3duIHRvIHBhc3MgZWcgInRhcmdldF8yMDE2IiB0byB0aGlzIGluIDIgcGxhY2VzPw0KDQpwIDwtIGdncGxvdChzY290bGFuZF9zbWFsbGVyKSArIA0KICBnZW9tX3NmKGFlcyhmaWxsID0gdGFyZ2V0XzIwMjEsIA0KICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUoIjxiPiIsIEhCTmFtZSwgIjwvYj5cbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQodGFyZ2V0XzIwMjEsIGRpZ2l0cyA9IDIpLCIlIiwgc2VwID0gIiIpKSkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gInBsYXNtYSIsIG5hbWUgPSAiNEhyIEEmRSBUYXJnZXQgJSIpKw0KICB0aGVtZV92b2lkKCkrDQogIGxhYnModGl0bGUgPSAiUGVyY2VudCBvZiBBJkUgZGVwdHMgbWFraW5nIHRoZSA0aHIgdGFyZ2V0IikNCg0KcCAlPiUNCiAgZ2dwbG90bHkodG9vbHRpcCA9ICJ0ZXh0IikgJT4lDQogIHN0eWxlKGhvdmVybGFiZWwgPSBsaXN0KGJnY29sb3IgPSAid2hpdGUiKSwgaG92ZXJvbiA9ICJmaWxsIiklPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQ0KYGBgDQoNCiMjIFNJTUQgZ3JhcGggDQoNCmBgYHtyfQ0Kc2ltZCA8LSByZWFkX2NzdigicmF3X2RhdGEvbm9uX2NvdmlkX3Jhd19kYXRhL2lucGF0aWVudF9hbmRfZGF5Y2FzZV9ieV9uaHNfYm9hcmRfb2ZfdHJlYXRtZW50X2FuZF9zaW1kLmNzdiIpICU+JSBqYW5pdG9yOjpjbGVhbl9uYW1lcygpDQoNCnNpbWQgPC0gc2ltZCAlPiUgDQptdXRhdGUocXVhcnRlcl9kYXRlID0geXEocXVhcnRlciksDQogICAgICAgeWVhciA9IHllYXIocXVhcnRlcl9kYXRlKSwgDQogICAgICAgLmFmdGVyID0gcXVhcnRlcikNCg0Kc2ltZCAlPiUgDQp3cml0ZV9jc3YoImNsZWFuX2RhdGEvbm9uX2NvdmlkX2RhdGEvc2ltZC5jc3YiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBhdmVyYWdlIGVwaXNvZGVzIGJ5IFNJTUQgdmFsdWUNCiMgY3VycmVudGx5IHVuZmlsdGVyZWQgZm9yIGhlYWx0aCBib2FyZCBvciBhZG1pc3Npb24gdHlwZSBldGMNCnNpbWRfcGxvdGx5IDwtIHNpbWQgJT4lIA0KICBkcm9wX25hKHNpbWQpICU+JQ0KICBtdXRhdGUoc2ltZCA9IGFzLmZhY3RvcihzaW1kKSkgJT4lICMgZ2l2ZXMgZWFjaCBzaW1kIGEgc2VwYXJhdGUgY29sb3VyDQogIGdyb3VwX2J5KHF1YXJ0ZXIsIHNpbWQpICU+JSANCiAgc3VtbWFyaXNlKGF2Z19lcGlzb2RlcyA9IG1lYW4oZXBpc29kZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcXVhcnRlciwgeSA9IGF2Z19lcGlzb2RlcywgZ3JvdXAgPSBzaW1kKSkrDQogIGdlb21fbGluZShhZXMoY29sb3VyID0gc2ltZCkpKw0KICBnZW9tX3BvaW50KGFlcyh0ZXh0ID0gcGFzdGUwKCJEYXRlOiAiLCBxdWFydGVyLCAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF2ZXJhZ2UgRXBpc29kZXM6ICIsIHJvdW5kKGF2Z19lcGlzb2RlcywgZGlnaXRzID0gMiksICI8YnI+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0lNRDogIiwgc2ltZCksDQogICAgICAgICAgICAgICAgICAgY29sb3VyID0gc2ltZCksc2l6ZSA9IDAuNSkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmNvbW1hKSsNCiAgbGFicyh0aXRsZSA9ICJBdmVyYWdlIEhvc3BpdGFsIEVwaXNvZGVzIGJ5IFNJTUQgRGVwcmV2YXRpb24gc2NvcmVcbiIsDQogICAgICAgeCA9ICJcblllYXIgYW5kIFF1YXJ0ZXIiLA0KICAgICAgIHkgPSAiQXZlcmFnZSBFcGlzb2Rlc1xuIikrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCg0KZ2dwbG90bHkoc2ltZF9wbG90bHksIHRvb2x0aXAgPSAidGV4dCIpICU+JSANCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpIA0KDQoNCmBgYA0KDQojIyBBZ2UgR3JhcGgNCg0KYGBge3J9DQphZ2Vfc2V4IDwtIHJlYWRfY3N2KCJyYXdfZGF0YS9ub25fY292aWRfcmF3X2RhdGEvaW5wYXRpZW50X2FuZF9kYXljYXNlX2J5X25oc19ib2FyZF9vZl90cmVhdG1lbnRfYWdlX2FuZF9zZXguY3N2IikgJT4lIGphbml0b3I6OmNsZWFuX25hbWVzKCkNCg0KYWdlX3NleCA8LSBhZ2Vfc2V4ICU+JQ0KICAgIG11dGF0ZShxdWFydGVyX2RhdGUgPSB5cShxdWFydGVyKSwNCiAgICAgICAgICAgeWVhciA9IHllYXIocXVhcnRlcl9kYXRlKSwNCiAgICAgICAgICAgLmFmdGVyID0gcXVhcnRlcikNCg0KYWdlX3NleCAlPiUgDQogIHdyaXRlX2NzdigiY2xlYW5fZGF0YS9ub25fY292aWRfZGF0YS9hZ2Vfc2V4LmNzdiIpDQpgYGANCg0KYGBge3J9DQoNCiMgQXZlcmFnZSBudW1iZXIgb2YgZXBpc29kZSBmb3IgYWdlIGdyb3Vwcw0KIyBjdXJyZW50bHkgdW5maWx0ZXJlZCBieSBkZXBhcnRtZW50IG9yIGFueXRoaW5nIGVsc2UNCmFnZV9wbG90bHkgPC0gYWdlX3NleCAlPiUgDQogICNmaWx0ZXIobWluX2RhdGUgPCB5ZWFyICYgeWVhciA8IG1heF9kYXRlKSAlPiUgDQogIGdyb3VwX2J5KHF1YXJ0ZXIsIGFnZSkgJT4lIA0KICBzdW1tYXJpc2UoYXZnX2VwaXNvZGVzID0gbWVhbihlcGlzb2RlcywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBxdWFydGVyLCB5ID0gYXZnX2VwaXNvZGVzKSkrDQogIGdlb21fbGluZShhZXMoY29sb3VyID0gYWdlLCBncm91cCA9IGFnZSkpKyANCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gYWdlLA0KICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKCJEYXRlOiAiLCBxdWFydGVyLCAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF2ZXJhZ2UgRXBpc29kZXM6ICIsIHJvdW5kKGF2Z19lcGlzb2RlcywgZGlnaXRzID0gMiksICI8YnI+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWdlIEdyb3VwOiAiLCBhZ2UpKSxzaXplID0gMC41KSsNCiAgbGFicyh0aXRsZSA9ICJBdmVyYWdlIEhvc3BpdGFsIEVwaXNvZGVzIGJ5IEFnZSBHcm91cHNcbiIsDQogICAgICAgeCA9ICJcblllYXIgYW5kIFF1YXJ0ZXIiLA0KICAgICAgIHkgPSAiQXZlcmFnZSBFcGlzb2Rlc1xuIikrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCiAgDQpnZ3Bsb3RseShhZ2VfcGxvdGx5LCB0b29sdGlwID0gInRleHQiKSAlPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQ0KYGBgDQoNCiMjIEdlbmRlcg0KDQpgYGB7cn0NCnNleF9wbG90bHkgPC0gYWdlX3NleCAlPiUgDQogIGdyb3VwX2J5KHF1YXJ0ZXIsIHNleCkgJT4lIA0KICBzdW1tYXJpc2UoYXZnX2xlbmd0aF9vZl9lcGlzb2RlID0gbWVhbihhdmVyYWdlX2xlbmd0aF9vZl9lcGlzb2RlLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHF1YXJ0ZXIsIHkgPSBhdmdfbGVuZ3RoX29mX2VwaXNvZGUpKSsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvdXIgPSBzZXgsIGdyb3VwID0gc2V4KSkrDQogIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IHNleCwgDQogICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoIkRhdGU6ICIsIHF1YXJ0ZXIsICI8YnI+IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmRlcjogIiwgc2V4KSksDQogICAgICAgICAgICAgICAgIHNpemUgPSAwLjUpKw0KICBsYWJzKHRpdGxlID0gIkF2ZXJhZ2UgSG9zcGl0YWwgRXBpc29kZXMgYnkgR2VuZGVyXG4iLA0KICAgICAgIHggPSAiXG5ZZWFyIGFuZCBRdWFydGVyIiwNCiAgICAgICB5ID0gIkF2ZXJhZ2UgRXBpc29kZXNcbiIpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQogIA0KDQpnZ3Bsb3RseShzZXhfcGxvdGx5LCB0b29sdGlwID0gInRleHQiKSAlPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQ0KYGBgDQojIyBBJkUgVGFiDQpgYGB7cn0NCiNUSEUgQSZFIFdBSSBUVElNRVMgSVMgSEFORExFRCBBQk9WRSBJTiBUSEUgU0hBUEVGSUxFIFdSQU5HTElORyBTRUNUSU9ODQpgYGANCg0KYGBge3J9DQoNCmxpYnJhcnkobGVhZmxldCkNCmxpYnJhcnkoc2YpDQojIHNjb3RsYW5kX3NtYWxsZXIgPC0gIHJlYWRPR1IoIi4uL1NHX05IU19IZWFsdGhCb2FyZHNfMjAxOV9zaGFwZWZpbGUvIixsYXllciA9ICJTR19OSFNfSGVhbHRoQm9hcmRzXzIwMTkiKQ0KIyBzaGFwZURhdGEgPC0gc3BUcmFuc2Zvcm0oc2NvdGxhbmRfc21hbGxlciwgQ1JTKCIrcHJvaj1sb25nbGF0ICtlbGxwcz1HUlM4MCIpKQ0KIyBzY290bGFuZCA8LSAgc2NvdGxhbmQgJT4lIA0KIyAgIG11dGF0ZShjZW50cmVzID0gc3RfY2VudHJvaWQoc3RfbWFrZV92YWxpZChnZW9tZXRyeSkpKSAlPiUNCiMgICAgIG11dGF0ZShsYXQgPSBzdF9jb29yZGluYXRlcyhjZW50cmVzKVssMV0sDQojICAgICAgICAgICAgbG9uZyA9IHN0X2Nvb3JkaW5hdGVzKGNlbnRyZXMpWywyXSkNCmxpYnJhcnkoaGVyZSkNCmhlcmUoKQ0KI3JlYWQgdGhlIGdlbyBwYWNrYWdlIGluDQpzY290bGFuZCA9IHN0X3JlYWQoImNsZWFuX2RhdGEvc2hhcGVmaWxlL3Njb3RsYW5kX3NtYWxsZXIuZ3BrZyIpDQoNCiN0cmFuc2Zvcm0gc28gbGVhZmxldCBpcyBoYXBweSB3aXRoIGl0DQpzY290bGFuZCA8LSBzdF90cmFuc2Zvcm0oc2NvdGxhbmQsICcrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCcpDQoNCnBhbCA8LSBjb2xvck51bWVyaWMoInZpcmlkaXMiLCBOVUxMKSAjIHNldCBjb2xvdXIgcGFsZXR0ZQ0KDQojIG9wZW4gdXAgbGVhZmxldCBhbmQgYWRkIHNjb3RsYW5kIGFzIGRhdGEsIGFsb25nIHdpdGggb3RoZXIgdmFyaWFibGVzDQptIDwtIGxlYWZsZXQoKSANCm0gJT4lIGFkZFRpbGVzKCkgJT4lIA0KICBhZGRQb2x5Z29ucyhkYXRhPXNjb3RsYW5kLA0KICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjMsIA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDEsDQogICAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWwodGFyZ2V0XzIwMDcpLA0KICAgICAgICAgICAgICBsYWJlbCA9IH5wYXN0ZTAoIEhCTmFtZSwiOiAiLCB0YXJnZXRfMjAwNyksDQogICAgICAgICAgICAgIHdlaWdodCA9IDEsIA0KICAgICAgICAgICAgICBoaWdobGlnaHRPcHRpb25zID0gaGlnaGxpZ2h0T3B0aW9ucyhjb2xvciA9ICJ3aGl0ZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0ID0gMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmluZ1RvRnJvbnQgPSBUUlVFKSkgJT4lIA0KICBhZGRMZWdlbmQocGFsID0gcGFsLCB2YWx1ZXMgPSBzY290bGFuZCR0YXJnZXRfMjAwNywgb3BhY2l0eSA9IDEpDQpgYGANCg==